/*
 * Copyright 2021 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef skgpu_graphite_Attribute_DEFINED
#define skgpu_graphite_Attribute_DEFINED

#include "include/private/base/SkAlign.h"
#include "src/core/SkSLTypeShared.h"
#include "src/gpu/graphite/DrawTypes.h"

namespace skgpu::graphite {
/* * Describes a vertex or instance attribute. */
class Attribute {
public:
    constexpr Attribute() = default;
    constexpr Attribute(const char *name, VertexAttribType cpuType, SkSLType gpuType)
        : fName(name), fCPUType(cpuType), fGPUType(gpuType)
    {
        SkASSERT(name && gpuType != SkSLType::kVoid);
    }
    constexpr Attribute(const Attribute &) = default;

    Attribute &operator = (const Attribute &) = default;

    constexpr bool isInitialized() const
    {
        return fGPUType != SkSLType::kVoid;
    }

    constexpr const char *name() const
    {
        return fName;
    }
    constexpr VertexAttribType cpuType() const
    {
        return fCPUType;
    }
    constexpr SkSLType gpuType() const
    {
        return fGPUType;
    }

    constexpr size_t size() const
    {
        return VertexAttribTypeSize(fCPUType);
    }
    constexpr size_t sizeAlign4() const
    {
        return SkAlign4(this->size());
    }

private:
    const char *fName = nullptr;
    VertexAttribType fCPUType = VertexAttribType::kFloat;
    SkSLType fGPUType = SkSLType::kVoid;
};
} // namespace skgpu::graphite

#endif // skgpu_graphite_Attribute_DEFINED
